package com.qianfeng.jdbc.utils;


//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼            BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  


import com.qianfeng.jdbc.mapper.RowMapper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Created by jackiechan on 2021/8/23 10:23
 * 封装了我们创建的数据库的操作
 * @author jackiechan
 * @version 1.0
 * @since 1.0
 */

public class DaoUtils {

    /**
     *
     * @param sql 要执行的 sql 语句
     * @param params 我们要求这个数据存放的是所有的参数,并且要求顺序和上面 sql 中的?保持一致
     * @throws SQLException
     */
    public static int commonsUpdate(String sql, Object[] params) throws SQLException {
        Connection connection = DBUtils.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.length; i++) {
                //获取到每一个参数
                statement.setObject((i+1),params[i]); // sql 中的下标是从 1 开始的,而数组是从 0 开始的,差 1 个
            }
        }
        int result = statement.executeUpdate();
        return result;
    }

    /**
     * 统一封装结果的方法
     * @param sql
     * @param params
     * @param rowMapper 专门解析 resultset的 mapper 对象,这是一个接口,实际上传递的是实现类, 也就是多态
     * @throws Exception
     */
    public static <T> List<T> commonsQuery(String sql, Object[] params, RowMapper<T> rowMapper) throws Exception {
        Connection connection = DBUtils.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.length; i++) {
                //获取到每一个参数
                statement.setObject((i+1),params[i]); // sql 中的下标是从 1 开始的,而数组是从 0 开始的,差 1 个
            }
        }
        ResultSet resultSet = statement.executeQuery();
        //我们发现不管查询什么表,在resutset 之前都是一样的,无非就是具体怎么处理 resultset
        List<T> tList = rowMapper.processResultSet(resultSet);
        // System.err.println(t);
        return tList;
    }


}
